package com.done.util.page.impl;

import java.util.ArrayList;

import org.hibernate.Query;
import org.hibernate.ScrollableResults;

import com.done.util.page.Page;
import com.done.util.page.PageRequest;

/**
 * Hibernate分页信息
 * 
 * @author badqiu
 * @see BasePage
 */
public class Hibernate3Page extends Page {

    /**
     * 构建HibernatePage对象，完成Hibernate的Query数据的分页处理
     * 
     * @param query Hibernate的Query对象
     * @param pageNumber 当前页编码，从1开始，如果传的值为Integer.MAX_VALUE表示获取最后一页。
     *            如果你不知道最后一页编码，传Integer.MAX_VALUE即可。如果当前页超过总页数，也表示最后一页。
     *            这两种情况将重新更改当前页的页码，为最后一页编码。
     * @param pageSize 每一页显示的条目数
     */
    public Hibernate3Page(Query query, int pageNumber, int pageSize) {
        super(pageNumber, pageSize, queryTatalCountByScrollableResults(query));
        result = query.setFirstResult((this.pageNumber - 1) * this.pageSize).setMaxResults(this.pageSize).list();
    }

    public Hibernate3Page(Query query, PageRequest p) {
        this(query, p.getPageNumber(), p.getPageSize());
    }

    /**
     * 构建HibernatePage对象，完成Hibernate的Query数据的分页处理
     * 
     * @param selectQuery Hibernate的查询Query对象
     * @param countQuery Hibernate的查询总数据行数的Query对象
     * @param pageNumber 当前页编码，从1开始，如果传的值为Integer.MAX_VALUE表示获取最后一页。
     *            如果你不知道最后一页编码，传Integer.MAX_VALUE即可。如果当前页超过总页数，也表示最后一页。
     *            这两种情况将重新更改当前页的页码，为最后一页编码。
     * @param pageSize 每一页显示的条目数
     */
    public Hibernate3Page(Query selectQuery, Query countQuery, int pageNumber, int pageSize) {
        super(pageNumber, pageSize, ((Number) countQuery.uniqueResult()).intValue());
        if (getTotalCount() == 0) {
            result = new ArrayList(0);
        } else {
            result = selectQuery.setFirstResult(getFirstResult()).setMaxResults(this.pageSize).list();
        }

    }

    public Hibernate3Page(Query selectQuery, Query countQuery, PageRequest p) {
        this(selectQuery, countQuery, p.getPageNumber(), p.getPageSize());
    }

    private static int queryTatalCountByScrollableResults(Query query) {
        ScrollableResults scrollableResults = query.scroll();
        scrollableResults.last();
        return scrollableResults.getRowNumber() + 1;
    }

}
